//
//  WBNetworkManager.swift
//  gc微博
//
//  Created by 高聪 on 16/11/10.
//  Copyright © 2016年 高聪. All rights reserved.
//

import UIKit
import AFNetworking // import 倒入文件夹的名字

/// Swift 的枚举支持任意数据类型
/// switch/enum oc 中之支持整数
enum WBHTTPMethod{
    case GET
    case POST
}
/// 网络管理工具
class WBNetworkManager: AFHTTPSessionManager {

    /// 静态区／常量／闭包
    //／在第一次访问时执行闭包，并且将结果保存在 shared 常量中
//    static let shared = WBNetworkManager()
    static let shared : WBNetworkManager = {
    
        // 实例化对象
        let instance = WBNetworkManager()
        
        // 设置响应反序列化支持的数据类型
    instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        // 返回对象
        return instance
    
    }()
    
    /// 用户账户的懒加载属性
    lazy var userAccount = WBUserAccount()
    
    /// 用户登录标记（计算型属性）
    var userLogon: Bool {
        return userAccount.access_token != nil
    }
    
    /// 专门负责拼接 token 的网络请求方法
    func tokenRequest(method: WBHTTPMethod = .GET, URLSring: String, parameters:[String: Any]?,completion:@escaping (_ json: Any? , _ isSuccess: Bool)->()) {
        
        // 处理token 字典
        // 0> 判断 token 是否为nil,为nil 直接返回  ,程序执行过程中 ，一般 token 不会为nil
        guard let token = userAccount.access_token else {
            //  发送通知，提示用户登录
            print("没有token 需要登录")
            
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUsereShouldLoginNotification), object: nil)
            
            completion(nil, false)
            
            return
        }
        
        // 1> 判断参数字典是否存在 ，如果为 nil 应该创建一个字典
        var parameters = parameters
        if parameters == nil {
            // 实例化字典
            parameters = [String: Any]()
        }
        
        // 2> 设置参数字典,代码在此处 字典一定有值
        parameters!["access_token"] = token
        
        
        // 调用request
        request(URLSring: URLSring, parameters: parameters, completion: completion)
    }
    
    /// 使用一个函数封装 AFN的 get／post 请求
    ///
    /// - parameter method:     GET/POST
    /// - parameter URLSring:   URLString
    /// - parameter parameters: 参数字典
    /// - parameter completion: 完成回调 ［json(字典／数组)，是否成功］
    func request(method: WBHTTPMethod = .GET, URLSring: String, parameters:[String: Any]?,completion:@escaping (_ json: Any? , _ isSuccess: Bool)->()) {
        
        // 成功回调
        let success = { (task: URLSessionDataTask, json: Any?) -> () in
            completion(json, true)
        }
        // 失败回调 
        let failure = { (task: URLSessionDataTask?, error: Error)->() in
            // 针对 403 处理用户 token 过期
            // 对于测试用户（应用程序还没有提交给新浪微博审核）每天的刷新量是有限的
            // 超出上限，token 会被锁定一定时间
            // 解决办法，新建一个应用程序
            if (task?.response as? HTTPURLResponse)?.statusCode == 403{
                print(" token 过期了")
                
                //  发送通知 提示用户登录（本方法不知道被谁调用，谁接受到通知，谁处理）
               NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUsereShouldLoginNotification), object: "bad token") 
                
            }
            
            
            // error 通常比较吓人，例如编号: xxxx 错误原因一堆英文
            print("网络请求错误 \(error)")
            completion(nil, false)
        }
        
        if method == .GET {
            get(URLSring, parameters: parameters, progress: nil, success: success, failure: failure)
        }else{
            post(URLSring, parameters: parameters, progress: nil, success: success, failure: failure)
        }
        
        
        
    }
}
